package threadPool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * # @File  : WorkStealingPool.java
 * # @Author: Lomo
 * # @Site  : lomo.space
 * # @Date  : 2021-09-01
 * # @Desc  : newWorkStealingPool
 *
 * 任务窃取线程池，不保证执行顺序，适合任务耗时差异较大。
 * 线程池中有多个线程队列，有的线程队列中有大量的比较耗时的任务堆积，
 * 而有的线程队列却是空的，就存在有的线程处于饥饿状态，当一个线程处于饥饿状态时，
 * 它就会去其它的线程队列中窃取任务。解决饥饿导致的效率问题。
 */
public class WorkStealingPool {
    //任务窃取线程池
    private static ExecutorService workStealingExecutor = Executors.newWorkStealingPool();

    public static void main(String[] args) {
        testWorkStealingExecutor();
    }

    //测试任务窃取线程池
    private static void testWorkStealingExecutor() {
        for (int i = 0; i < 6; i++) {//本机 CPU 4核（8线程），这里创建6个任务进行测试
            final int index = i;
            workStealingExecutor.execute(new Runnable() {
                public void run() {
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + " index:" + index);
                }
            });
        }

        try {
            Thread.sleep(4000);//这里主线程不休眠，不会有打印输出
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("4秒后...");

        workStealingExecutor.shutdown();
    }
}
